using System.Drawing;
using System.Windows.Forms;

namespace WeifenLuo.WinFormsUI.Docking
{
    internal static class DockHelper
    {
        public static bool IsDockStateAutoHide(DockState dockState)
        {
            if(dockState == DockState.DockLeftAutoHide || dockState == DockState.DockRightAutoHide
               || dockState == DockState.DockTopAutoHide || dockState == DockState.DockBottomAutoHide){
                return true;
            } else{
                return false;
            }
        }
        public static bool IsDockStateValid(DockState dockState, DockAreas dockableAreas)
        {
            if(((dockableAreas & DockAreas.Float) == 0) && (dockState == DockState.Float)){
                return false;
            } else if(((dockableAreas & DockAreas.Document) == 0) && (dockState == DockState.Document)){
                return false;
            } else if(((dockableAreas & DockAreas.DockLeft) == 0)
                      && (dockState == DockState.DockLeft || dockState == DockState.DockLeftAutoHide)){
                return false;
            } else if(((dockableAreas & DockAreas.DockRight) == 0)
                      && (dockState == DockState.DockRight || dockState == DockState.DockRightAutoHide)){
                return false;
            } else if(((dockableAreas & DockAreas.DockTop) == 0)
                      && (dockState == DockState.DockTop || dockState == DockState.DockTopAutoHide)){
                return false;
            } else if(((dockableAreas & DockAreas.DockBottom) == 0)
                      && (dockState == DockState.DockBottom || dockState == DockState.DockBottomAutoHide)){
                return false;
            } else{
                return true;
            }
        }
        public static bool IsDockWindowState(DockState state)
        {
            if(state == DockState.DockTop || state == DockState.DockBottom || state == DockState.DockLeft
               || state == DockState.DockRight || state == DockState.Document){
                return true;
            } else{
                return false;
            }
        }
        public static DockState ToggleAutoHideState(DockState state)
        {
            if(state == DockState.DockLeft){
                return DockState.DockLeftAutoHide;
            } else if(state == DockState.DockRight){
                return DockState.DockRightAutoHide;
            } else if(state == DockState.DockTop){
                return DockState.DockTopAutoHide;
            } else if(state == DockState.DockBottom){
                return DockState.DockBottomAutoHide;
            } else if(state == DockState.DockLeftAutoHide){
                return DockState.DockLeft;
            } else if(state == DockState.DockRightAutoHide){
                return DockState.DockRight;
            } else if(state == DockState.DockTopAutoHide){
                return DockState.DockTop;
            } else if(state == DockState.DockBottomAutoHide){
                return DockState.DockBottom;
            } else{
                return state;
            }
        }
        public static DockPane PaneAtPoint(Point pt, DockPanel dockPanel)
        {
            for(Control control = Win32Helper.ControlAtPoint(pt); control != null; control = control.Parent){
                IDockContent content = control as IDockContent;
                if(content != null && content.DockHandler.DockPanel == dockPanel){
                    return content.DockHandler.Pane;
                }
                DockPane pane = control as DockPane;
                if(pane != null && pane.DockPanel == dockPanel){
                    return pane;
                }
            }
            return null;
        }
        public static FloatWindow FloatWindowAtPoint(Point pt, DockPanel dockPanel)
        {
            for(Control control = Win32Helper.ControlAtPoint(pt); control != null; control = control.Parent){
                FloatWindow floatWindow = control as FloatWindow;
                if(floatWindow != null && floatWindow.DockPanel == dockPanel){
                    return floatWindow;
                }
            }
            return null;
        }
    }
}